package com.shouhe.mysap.util;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.shouhe.mysap.common.PageResult;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @author 守鹤
 * @date 2020/6/1 0:15
 */
public class PageResultUtil {

    /**
     * 得到所有分页的数据
     *
     * @param page    前端传递的页码
     * @param rows    前端传递的显示条数
     * @param service 业务层对象
     * @param <T>     实体类
     * @return 分页数据
     */
    public static <T> PageResult getPageResult(Integer page, Integer rows, IService<T> service) {
        Page<T> p = new Page<>(page, rows);
        IPage<T> iPage = service.page(p, null);
        List<T> records = iPage.getRecords();
        return PageResult.getInstance(iPage.getTotal(), records);
    }

    /**
     * 通过 status 状态的数组 得到对应的数据
     *
     * @param page
     * @param rows
     * @param service
     * @param status
     * @param <T>
     * @return
     */
    public static <T> PageResult getPageResult(Integer page, Integer rows, IService<T> service, Integer[] status) {
        Page<T> p = new Page<>(page, rows);
        QueryWrapper<T> wrapper = new QueryWrapper<>();
        wrapper.in("status", Arrays.asList(status));
        IPage<T> iPage = service.page(p, wrapper);
        List<T> records = iPage.getRecords();
        return PageResult.getInstance(iPage.getTotal(), records);
    }

    /**
     * 根据相等条件和模糊条件，分页查询数据
     *
     * @param page    前端传递的页码
     * @param rows    前端传递的显示条数
     * @param service 业务层对象
     * @param eqMap   相等的条件
     * @param likeMap 模糊的条件
     * @param <T>     实体类
     * @return 分页数据
     */
    public static <T> PageResult getPageResultEqLikeMap(Integer page, Integer rows, IService<T> service, Map<String, Object> eqMap, Map<String, Object> likeMap) {
        Page<T> p = new Page<>(page, rows);
        QueryWrapper<T> wrapper = new QueryWrapper<>();
        if (eqMap != null) {
            Set<String> keys = eqMap.keySet();
            for (String key : keys) {
                Object value = eqMap.get(key);
                assemblyEqWrapper(key, value, wrapper);
            }
        }
        if (likeMap != null) {
            Set<String> keys = likeMap.keySet();
            for (String key : keys) {
                Object value = likeMap.get(key);
                assemblyLikeWrapper(key, value, wrapper);
            }
        }
        IPage<T> iPage = service.page(p, wrapper);
        List<T> records = iPage.getRecords();
        return PageResult.getInstance(iPage.getTotal(), records);
    }


    /**
     * 通过与字段相等的比较得到对应的数据
     *
     * @param page
     * @param rows
     * @param service
     * @param column
     * @param value
     * @param <T>
     * @return
     */
    public static <T> PageResult getPageResultEq(Integer page, Integer rows, IService<T> service, String column, Object value) {
        Page<T> p = new Page<>(page, rows);
        QueryWrapper<T> wrapper = new QueryWrapper<>();
        wrapper.eq(column, value);
        IPage<T> iPage = service.page(p, wrapper);
        List<T> records = iPage.getRecords();
        return PageResult.getInstance(iPage.getTotal(), records);
    }


    /**
     * 通过与多个字段相等的比较得到对应的数据
     *
     * @param page
     * @param rows
     * @param service
     * @param map
     * @param <T>
     * @return
     */
    public static <T> PageResult getPageResultAllEq(Integer page, Integer rows, IService<T> service, Map<String, Object> map) {
        Page<T> p = new Page<>(page, rows);
        QueryWrapper<T> wrapper = new QueryWrapper<>();
        for (String key : map.keySet()) {
            if (key != null) {
                Object o = map.get(key);
                if (o != null && !"".equals(o.toString())) {
                    wrapper.eq(key, o);
                }
            }
        }
        IPage<T> iPage = service.page(p, wrapper);
        List<T> records = iPage.getRecords();
        return PageResult.getInstance(iPage.getTotal(), records);
    }


    /**
     * 通过判断Map中的值是否为默认值来判断是否要作为条件,默认相等判断
     *
     * @param value   map中的值
     * @param wrapper 条件构造器
     * @param <T>     实体类
     */
    private static <T> void assemblyEqWrapper(String key, Object value, QueryWrapper<T> wrapper) {
        if (value instanceof Number) {
            Integer num = (Integer) value;
            if (num != -1) {
                wrapper.eq(key, value);
            }
        }
        if (value instanceof String) {
            if (!"null".equals(value.toString())) {
                wrapper.eq(key, value);
            }
        }
    }


    /**
     * 通过判断Map中的值是否为默认值来判断是否要作为条件,默认模糊判断
     *
     * @param value   map中的值
     * @param wrapper 条件构造器
     * @param <T>     实体类
     */
    private static <T> void assemblyLikeWrapper(String key, Object value, QueryWrapper<T> wrapper) {
        if(value!=null){
            if (!"null".equals(value.toString())) {
                wrapper.like(key, value);
            }
        }
    }


}
